package com.aspire.aimini.model.dto;

import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.experimental.Accessors;


import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Map;

/**
 * AI生成记录数据传输对象
 *
 * @author wangguiyou
 * @date 2024-12-19
 */
@Data
@Accessors(chain = true)
public class GenerationRecordDTO implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 记录ID
     */
    private Long id;

    /**
     * 用户ID
     */
    @NotNull(message = "用户ID不能为空")
    private Long userId;

    /**
     * 服务类型
     */
    @NotBlank(message = "服务类型不能为空")
    private String serviceType;

    /**
     * AI配置ID
     */
    private Long aiConfigId;

    /**
     * 输入内容
     */
    @NotBlank(message = "输入内容不能为空")
    private String inputContent;

    /**
     * 输出内容
     */
    private String outputContent;

    /**
     * 生成状态
     */
    private String status;

    /**
     * 错误信息
     */
    private String errorMessage;

    /**
     * 响应时间（毫秒）
     */
    private Long responseTime;

    /**
     * 消耗成本
     */
    @Min(value = 0, message = "消耗成本不能小于0")
    private Double cost;

    /**
     * 输入Token数量
     */
    private Integer inputTokens;

    /**
     * 输出Token数量
     */
    private Integer outputTokens;

    /**
     * 总Token数量
     */
    private Integer totalTokens;

    /**
     * 模型名称
     */
    private String model;

    /**
     * 服务提供商
     */
    private String provider;

    /**
     * 请求参数（JSON格式）
     */
    private String requestParams;

    /**
     * 响应数据（JSON格式）
     */
    private String responseData;

    /**
     * 客户端IP
     */
    private String clientIp;

    /**
     * 用户代理
     */
    private String userAgent;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    private LocalDateTime updateTime;

    /**
     * 请求参数Map（用于前端展示）
     */
    private Map<String, Object> requestParamsMap;

    /**
     * 响应数据Map（用于前端展示）
     */
    private Map<String, Object> responseDataMap;

    /**
     * 服务类型描述
     */
    private String serviceTypeDescription;

    /**
     * 状态描述
     */
    private String statusDescription;

    /**
     * 可读的响应时间
     */
    private String readableResponseTime;

    /**
     * 可读的成本
     */
    private String readableCost;

    /**
     * 输入内容预览（截取前100个字符）
     */
    private String inputPreview;

    /**
     * 输出内容预览（截取前200个字符）
     */
    private String outputPreview;

    /**
     * 是否成功
     */
    private Boolean isSuccess;

    /**
     * 质量评分（1-5）
     */
    private Integer qualityScore;

    /**
     * 用户评价
     */
    private String userFeedback;

    /**
     * 是否收藏
     */
    private Boolean isFavorite;

    /**
     * 使用次数
     */
    private Integer usageCount;

    /**
     * 最后使用时间
     */
    private LocalDateTime lastUsedTime;

    /**
     * 获取服务类型描述
     */
    public String getServiceTypeDescription() {
        if (serviceType == null) {
            return "未知";
        }
        switch (serviceType) {
            case "image_tagging":
                return "图片标签识别";
            case "copywriting_generation":
                return "文案生成";
            case "similar_image_generation":
                return "相似图片生成";
            case "image_analysis":
                return "图片内容分析";
            case "style_transfer":
                return "图片风格转换";
            case "background_removal":
                return "图片背景移除";
            case "image_enhancement":
                return "图片质量增强";
            case "text_to_image":
                return "文本转图片";
            case "image_to_text":
                return "图片转文本描述";
            default:
                return serviceType;
        }
    }

    /**
     * 获取状态描述
     */
    public String getStatusDescription() {
        if (status == null) {
            return "未知";
        }
        switch (status) {
            case "pending":
                return "等待中";
            case "processing":
                return "处理中";
            case "success":
                return "成功";
            case "failed":
                return "失败";
            case "timeout":
                return "超时";
            case "cancelled":
                return "已取消";
            default:
                return status;
        }
    }

    /**
     * 获取可读的响应时间
     */
    public String getReadableResponseTime() {
        if (responseTime == null || responseTime < 0) {
            return "0ms";
        }
        if (responseTime < 1000) {
            return responseTime + "ms";
        }
        return String.format("%.2fs", responseTime / 1000.0);
    }

    /**
     * 获取可读的成本
     */
    public String getReadableCost() {
        if (cost == null || cost <= 0) {
            return "免费";
        }
        if (cost < 0.01) {
            return String.format("%.4f元", cost);
        }
        return String.format("%.2f元", cost);
    }

    /**
     * 获取输入内容预览
     */
    public String getInputPreview() {
        if (inputContent == null || inputContent.isEmpty()) {
            return "";
        }
        if (inputContent.length() <= 100) {
            return inputContent;
        }
        return inputContent.substring(0, 100) + "...";
    }

    /**
     * 获取输出内容预览
     */
    public String getOutputPreview() {
        if (outputContent == null || outputContent.isEmpty()) {
            return "";
        }
        if (outputContent.length() <= 200) {
            return outputContent;
        }
        return outputContent.substring(0, 200) + "...";
    }

    /**
     * 检查是否成功
     */
    public boolean isSuccess() {
        return "success".equals(status);
    }

    /**
     * 检查是否失败
     */
    public boolean isFailed() {
        return "failed".equals(status) || "timeout".equals(status);
    }

    /**
     * 检查是否正在处理
     */
    public boolean isProcessing() {
        return "processing".equals(status) || "pending".equals(status);
    }

    /**
     * 获取质量评分描述
     */
    public String getQualityScoreDescription() {
        if (qualityScore == null) {
            return "未评分";
        }
        switch (qualityScore) {
            case 5:
                return "优秀";
            case 4:
                return "良好";
            case 3:
                return "一般";
            case 2:
                return "较差";
            case 1:
                return "很差";
            default:
                return "未知";
        }
    }

    /**
     * 获取Token使用效率
     */
    public String getTokenEfficiency() {
        if (totalTokens == null || totalTokens <= 0 || responseTime == null || responseTime <= 0) {
            return "N/A";
        }
        double tokensPerSecond = (double) totalTokens / (responseTime / 1000.0);
        return String.format("%.1f tokens/s", tokensPerSecond);
    }

    /**
     * 获取成本效率
     */
    public String getCostEfficiency() {
        if (cost == null || cost <= 0 || totalTokens == null || totalTokens <= 0) {
            return "N/A";
        }
        double costPerToken = cost / totalTokens;
        return String.format("%.6f元/token", costPerToken);
    }

    /**
     * 获取输入输出比例
     */
    public String getInputOutputRatio() {
        if (inputTokens == null || outputTokens == null || inputTokens <= 0) {
            return "N/A";
        }
        double ratio = (double) outputTokens / inputTokens;
        return String.format("1:%.2f", ratio);
    }

    /**
     * 获取使用频率描述
     */
    public String getUsageFrequencyDescription() {
        if (usageCount == null || usageCount <= 0) {
            return "未使用";
        }
        if (usageCount == 1) {
            return "使用1次";
        }
        if (usageCount <= 5) {
            return "偶尔使用";
        }
        if (usageCount <= 20) {
            return "经常使用";
        }
        return "频繁使用";
    }

    /**
     * 检查是否为高质量生成
     */
    public boolean isHighQuality() {
        return qualityScore != null && qualityScore >= 4;
    }

    /**
     * 检查是否为快速响应
     */
    public boolean isFastResponse() {
        return responseTime != null && responseTime <= 3000; // 3秒内
    }

    /**
     * 检查是否为低成本
     */
    public boolean isLowCost() {
        return cost != null && cost <= 0.1; // 0.1元以内
    }
}